<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js过滤树并保留父节点</title>
</head>

<body>
    <script>
        var obj =
        {
            title: 'root',
            children: [
                {
                    title: 'a', flag: true, children: [
                        { title: 'aa', flag: false },
                        { title: 'bb', flag: true },
                    ]
                },
                {
                    title: 'b', flag: true, children: [
                        { title: 'aa', flag: false },
                        { title: 'bb', flag: true },
                    ]
                },
            ]
        }

        var obj2 = filterTree(obj, node => node.title.includes('a'))

        console.log('obj2', obj2)

        function filterTree (node, predicate) {
            // 检查当前节点是否需要保留
            if (predicate(node)) {
                // 如果需要保留，则为其子节点调用过滤函数
                if (node.children) {
                    node.children = node.children.filter(child => filterTree(child, predicate)).filter(Boolean);
                }
                // 返回当前节点以保留
                return node;
            }
            // 如果当前节点不需要保留，则检查其子节点
            if (node.children) {
                // 使用filterTree函数过滤子节点，并去除空值
                node.children = node.children.filter(child => filterTree(child, predicate)).filter(Boolean);
                // 如果过滤后子节点为空，则返回undefined，表示需要去除当前节点
                return node.children.length ? node : undefined;
            }
            // 如果节点既不满足条件，也没有子节点，返回undefined
            return undefined;
        }
    </script>
</body>

</html>